package com.kelvin.backend.common.web.service;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.kelvin.backend.common.web.dao.BaseDao;
import com.kelvin.backend.common.web.entity.BaseEntity;
import com.kelvin.backend.common.web.entity.page.PageEntity;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;

/**
 * <p>Title: BaseService</p>
 * <p>Description: </p>
 *
 * @author Kelvin.Chen
 * @datetime 2021/7/9 10:07
 */
public interface IBaseService<T extends BaseEntity> {

    BaseDao<T> getDao();

    default boolean save(T entity) {
        return SqlHelper.retBool(this.getDao().insert(entity));
    }

    default boolean update(T entity) {
        return SqlHelper.retBool(this.getDao().updateById(entity));
    }

    default boolean updateByWrapper(T entity, Wrapper<T> wrapper) {
        return SqlHelper.retBool(this.getDao().update(entity, wrapper));
    }

    default boolean deleteById(Serializable id) {
        return SqlHelper.retBool(this.getDao().deleteById(id));
    }

    default boolean deleteByIds(Collection<? extends Serializable> ids) {
        return SqlHelper.retBool(this.getDao().deleteBatchIds(ids));
    }

    default T selectById(Serializable id) {
        return this.getDao().selectById(id);
    }

    default T selectOne(Wrapper<T> queryWrapper) {
        return this.getDao().selectOne(queryWrapper);
    }

    default List<T> selectByIds(Collection<? extends Serializable> ids) {
        return this.getDao().selectBatchIds(ids);
    }

    default List<T> selectByWrapper(Wrapper<T> queryWrapper) {
        return this.getDao().selectList(queryWrapper);
    }

    default Integer count() {
        return this.count(Wrappers.emptyWrapper());
    }

    default Integer count(Wrapper<T> queryWrapper) {
        return this.getDao().selectCount(queryWrapper);
    }

    Page<T> selectPage(PageEntity pageEntity, Wrapper<T> queryWrapper);

    Page<T> selectPage(PageEntity pageEntity);
    
    boolean saveOrUpdate(T entity);

    List<T> selectByWrapper(Wrapper<T> queryWrapper, ServiceHandle<T> serviceHandle);

    Page<T> selectPage(PageEntity pageEntity, Wrapper<T> queryWrapper, ServiceHandle<T> serviceHandle);
}
